package edu.eam.tallermecanicoejb.beans;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.faces.bean.SessionScoped;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import edu.eam.tallermecanicojpa.dao.ClienteDAO;
import edu.eam.tallermecanicojpa.entidades.Cliente;

/**
 * Session bean del cliente
 */
@Stateless
@SessionScoped
public class ClienteBean {

	@PersistenceContext
	/**
	 * EntityManager para manejar las transacciones del cliente con la base de
	 * datos
	 */
	private EntityManager entityManager;

	/* Data Acces Object del cliente */
	private ClienteDAO clienteDAO;

	/* Constructor del clienteBean vacio */
	public ClienteBean() {
		super();
	}

	@PostConstruct
	/* Metodo para inicializar el ClienteDAO */
	public void inicializarClienteDAO() {
		clienteDAO = new ClienteDAO(entityManager);
	}

	/**
	 * Metodo para persistir un cliente en la base de datos
	 * 
	 * @param cliente
	 *            Cliente que se quiere persistir en la base de datos
	 */
	public void persistir(Cliente cliente) {
		clienteDAO.persistir(cliente);
	}

	/**
	 * Metodo para actualizar un cliente en la base de datos
	 * 
	 * @param cliente
	 *            Cliente que se quiere actualizar en la base de datos
	 */
	public void actualizar(Cliente cliente) {
		clienteDAO.actualizar(cliente);
	}

	/**
	 * Metodo para recuperar un cliente de la base de datos conociendo su numero
	 * de identificacion
	 * 
	 * @param id
	 *            Numero de identificacion del cliente que se quiere recuperar
	 *            de la base de datos
	 * @return El cliente que se encontro con el id o null si no se encontro
	 */
	public Cliente recuperar(long id) throws Exception {
		return clienteDAO.recuperar(id);
	}

	/**
	 * Metodo para eliminar un cliente de la base de datos
	 * 
	 * @param cliente
	 *            Cliente que se quiere eliminar de la base de datos
	 */
	public void eliminar(Cliente cliente) {
		clienteDAO.eliminar(cliente);
	}

	/* Metodo para listar todos los clientes de la base de datos */
	public List<Cliente> listar() {
		return clienteDAO.listar();
	}

	/**
	 * Metodo para recuperar un cliente y sus automoviles de la base de datos
	 * conociendo su numero de identificacion
	 * 
	 * @param id
	 *            Numero de identificacion del cliente que se quiere recuperar
	 *            de la base de datos
	 * @return El cliente que se encontro con el id o null si no se encontro
	 */
	public Cliente recuperarConAutomoviles(long id) throws Exception {
		return clienteDAO.recuperarConAutomoviles(id);
	}

	/**
	 * Metodo para listar todos los clientes con sus automoviles de la base de
	 * datos
	 */
	public List<Cliente> listarConAutomoviles() {
		return clienteDAO.listarConAutomoviles();
	}

	/**
	 * Metodo para recuperar un cliente de la base de datos conociendo su numero
	 * de cedula
	 * 
	 * @param cedula
	 *            Numero de cedula del cliente que se quiere recuperar de la
	 *            base de datos
	 * @return El cliente que se encontro con la cedula o null si no se encontro
	 */
	public Cliente recuperarPorCedula(String cedula) throws Exception {
		return clienteDAO.recuperarPorCedula(cedula);
	}

	/**
	 * Metodo para recuperar un cliente y sus automoviles de la base de datos
	 * conociendo su numero de cedula
	 * 
	 * @param cedula
	 *            Numero de cedula del cliente que se quiere recuperar de la
	 *            base de datos
	 * @return El cliente que se encontro con la cedula o null si no se encontro
	 */
	public Cliente recuperarConAutomovilesPorCedula(String cedula)
			throws Exception {
		return clienteDAO.recuperarConAutomovilesPorCedula(cedula);
	}
}
